package common

import (
	"encoding/json"
	"log"
	"net/http"
	"strings"
	"time"

	"github.com/gorhill/cronexpr"
)

// 任务
type Job struct {
	Name     string `json:"name"`     // 任务名
	Command  string `json:"command"`  // shell命令
	CronExpr string `json:"cronExpr"` // cron表达式
}

// 变化事件 save delete
type JobEvent struct {
	EventType int
	Job       *Job
}

// 任务调度计划
type JobSchedulePlan struct {
	Job      *Job
	Expr     *cronexpr.Expression
	NextTime time.Time
}

// 统一错误处理
func DealError(step string, err error) {
	if err != nil {
		log.Println(step)
		log.Fatal(err)
	}
}

// 返回信息结构体
type Response struct {
	Errno int         `json:"errno"`
	Msg   string      `json:"msg"`
	Data  interface{} `json:"data"`
}

// 返回信息
func BuildResp(w http.ResponseWriter, errno int, msg string, data interface{}) {
	response := &Response{
		Errno: errno,
		Msg:   msg,
		Data:  data,
	}
	resp, err := json.Marshal(response)
	if err != nil {
		DealError("json", err)
	}
	w.Write(resp)
}

// 解析函数
func ParseParam(r *http.Request) {
	err := r.ParseForm()
	DealError("参数解析", err)
}

// 反序列化
func UnpackJob(value []byte) (ret *Job, err error) {
	if err = json.Unmarshal(value, &ret); err != nil {
		return
	}
	return
}

// 从etcd提取任务名
func ExtractJobName(jobKey string) string {
	return strings.TrimPrefix(jobKey, JOB_SAVE_DIR)
}

// 任务变化事件
func BuildJobEvent(eventType int, job *Job) *JobEvent {
	return &JobEvent{
		EventType: eventType,
		Job:       job,
	}
}

// 任务执行计划
func BuildJobSchedulePlan(job *Job) (jobSchedulePlan *JobSchedulePlan, err error) {
	expr, err := cronexpr.Parse(job.CronExpr)
	if err != nil {
		return
	}
	jobSchedulePlan = &JobSchedulePlan{
		Job:      job,
		Expr:     expr,
		NextTime: expr.Next(time.Now()),
	}
	return
}
